
// nodejs 提供了 http 模块，自身就可以用来构建服务器

let http = require("http");
let url = require("url");
let path = require("path");
let fs = require("fs");
let fsp = require("fs/promises");

let server = http.createServer(); // 创建服务

// 站点的默认路径
let siteUrl = path.join(__dirname,"../site");

// 当浏览器发送请求时 => 服务器接收请求 处理 返回响应内容 (站点->前端页面 后端接口-> 业务处理)
server.on("request",function(req,res){// 每次浏览器向服务器发送请求时都会触发
    // 形参
    // req => 用于存放请求相关的信息 => 请求方式 请求地址 携带数据(get/post) 请求头
    // res => 用于存放和设置响应相关的信息 => 设置状态码 响应正文
    if(req.url != "/favicon.ico") {
        console.log("接收到浏览器发送的请求",req.url); // 浏览器发送请求时的请求地址
        // console.log(req.url);
        var URL = url.parse(req.url,true);  //  对url进行解析  => 对象
        // console.log(URL);

        var {pathname,query} = URL;   // /index.html   查找对象中的路径部分

        // 在服务器中搭建站点
        var readPath = path.join(siteUrl,pathname);

        var bool = fs.existsSync(readPath);  // 判断文件/文件夹是否存在

        if(bool){   

            // 针对不同类型的文件 => 服务器返回数据时,返回对应的文件类型
            var ext = path.extname(readPath);
            console.log(ext);

            // // 服务器响应时的数据的类型和编码格式
            switch(ext){
                case ".html": 
                    res.setHeader("Content-Type","text/html;charset=utf-8");
                    break;
                case ".css": 
                    res.setHeader("Content-Type","text/css;charset=utf-8");
                    break;
                case ".js": 
                    res.setHeader("Content-Type","text/javascript;charset=utf-8");
                    break;
                case ".json": 
                    res.setHeader("Content-Type","text/json;charset=utf-8");
                    break;
                case ".png": 
                    res.setHeader("Content-Type","image/png");
                    break;
                case ".jpg": 
                    res.setHeader("Content-Type","image/jpg");
                    break;
                case ".gif": 
                    res.setHeader("Content-Type","image/gif");
                    break;
                case ".webp": 
                    res.setHeader("Content-Type","image/webp");
                    break;
            }

            // 从站点(site)中找到对应路径的文件进行渲染
            fsp.readFile(readPath).then(ctx=>{
                // console.log("ctx",ctx);
                res.write(ctx);
            }).catch(err =>{
                res.write(err.stack)
            }).finally(()=>{
                res.end()
            })
        }else{
            res.end("Not Found!");   
        }






    }else{
        res.end();
    }

})

// 启动的服务器监听3000端口(闲置端口)  
server.listen(3000,function(){ // 服务器启动时执行的回调函数
    console.log("服务器启动http://127.0.0.1:3000");
})








